/***************************************************************************
                                                                             
RRRRRRRRRRRRRRRRR                                              999999999     
R::::::::::::::::R                                           99:::::::::99   
R::::::RRRRRR:::::R                                        99:::::::::::::99 
RR:::::R     R:::::R                                      9::::::99999::::::9
  R::::R     R:::::R    eeeeeeeeeeee  xxxxxxx      xxxxxxx9:::::9     9:::::9
  R::::R     R:::::R  ee::::::::::::ee x:::::x    x:::::x 9:::::9     9:::::9
  R::::RRRRRR:::::R  e::::::eeeee:::::eex:::::x  x:::::x   9:::::99999::::::9
  R:::::::::::::RR  e::::::e     e:::::e x:::::xx:::::x     99::::::::::::::9
  R::::RRRRRR:::::R e:::::::eeeee::::::e  x::::::::::x        99999::::::::9 
  R::::R     R:::::Re:::::::::::::::::e    x::::::::x              9::::::9  
  R::::R     R:::::Re::::::eeeeeeeeeee     x::::::::x             9::::::9   
  R::::R     R:::::Re:::::::e             x::::::::::x           9::::::9    
RR:::::R     R:::::Re::::::::e           x:::::xx:::::x         9::::::9     
R::::::R     R:::::R e::::::::eeeeeeee  x:::::x  x:::::x       9::::::9      
R::::::R     R:::::R  ee:::::::::::::e x:::::x    x:::::x     9::::::9       
RRRRRRRR     RRRRRRR    eeeeeeeeeeeeeexxxxxxx      xxxxxxx   99999999        

 * 文件名：mcp4725.c
 * 版本号：V1.0
 * 作者: rex9
 * 生成日期：Dec 30, 2020
 * 最近修改：
 * 功能描诉：MCP4725————硬件I2C DMA方式发送
 * 说明：
 * STM32CubeMX配置I2C1 Fast Mode
 * I2C1_TX DMA1 Channel 6
 * 使能所有中断
 *
 * 模块引脚：
 * VCC：电源
 * GND：地
 * SCL：PB6
 * SDA：PB7
 * OUT：模拟量输出
 * GND：输出地
 *
 ***************************************************************************
 */

#include "mcp4725.h"

//I2C句柄
extern I2C_HandleTypeDef hi2c1;
//设备地址
#define MCP4725_ADDRESS		0xC0
//DMA结束标志
volatile uint8_t g_i2c_tx_flag=0;

/**
 * @brief  ：主机DMA发送
 * @param  ：buffer：数据缓存指针
 * @param  ：Size：发送数量
 * @return：无
 */
void MCP4725_SendData_DMA(uint8_t* buffer,uint16_t size)
{
	//使用MCP4725的快速模式，其命令格式为
	// | 1 1 0 0 A2 A1 A0 0 | 0 0 PD1 PD0 D11 D10 D9 D8 | D7 D6 D5 D4 D3 D2 D1 D0 |
	//第一个字节为设备地址，由设备代码和地址位，读写切换三部分组成：
	//设备代码固定为1100，地址位A2，A1固定为0，0，A0由外部接线决定（本项目接地，为0）
	//最后一位0为写，1为读。这样，第一字节就是固定的0xC0.
	//第二个字节C2，C1查表可知为0，0，PD1，PD0查表可知为0，0，后面接发送数据的高4位。
	//第三个字节为数据低8位。与上个字节的高4位组成一个12bit的数据，取值范围（0～4095）。
	//点更新速度按50us算
	g_i2c_tx_flag=0;
	if(HAL_I2C_Master_Transmit_DMA(&hi2c1,MCP4725_ADDRESS,buffer,size)!=HAL_OK)
	{
		Error_Handler();
	}
	while(g_i2c_tx_flag==0) ;	//等待DMA完成
}

/**
 * @brief  ：主机发送完成回调函数
 * @param  ：hi2c：设备指针
 * @return：无
 */
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef* hi2c)
{
	if(hi2c==&hi2c1)
	{
		  g_i2c_tx_flag=1;
	}
}
